from django.contrib.auth.models import User
from django.db import models

from utils.modelsMinxin import ModelsSetMixin, DateTimeModelsMixin


# Create your models here.


# 商品分类模型

class Classification(ModelsSetMixin):
    name = models.CharField(max_length=40, verbose_name="分类名", unique=True)
    # 分类层级关系  自关联
    parent = models.ForeignKey("self", on_delete=models.SET_NULL, null=True, blank=True)

    class Meta:
        db_table = 'classification'
        verbose_name = "商品分类"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


# 商品模型表
class Commodity(ModelsSetMixin):
    STATUS_CHOICES = ((0, "未发布"), (1, "发布"))
    name = models.CharField(max_length=40, verbose_name="商品名")
    caption = models.CharField(max_length=140, verbose_name="副标题")
    brand = models.CharField(max_length=40, verbose_name="品牌", null=True, blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="单价")
    stock = models.IntegerField(verbose_name="库存")
    pack = models.TextField(verbose_name="包装信息", null=True, blank=True)
    serviceafter_sale = models.TextField(verbose_name="售后服务", null=True, blank=True)
    sales = models.IntegerField(verbose_name="销量", default=0)
    comments = models.IntegerField(verbose_name="评价数", default=0)
    status = models.IntegerField(choices=STATUS_CHOICES, default=0, verbose_name="状态")
    detail = models.TextField(verbose_name="详情", null=True, blank=True)

    classification1 = models.ForeignKey(Classification, on_delete=models.PROTECT, verbose_name="一级分类",
                                        related_name="classification1")
    classification2 = models.ForeignKey(Classification, on_delete=models.PROTECT, verbose_name="二级分类",
                                        related_name="classification2")

    class Meta:
        ordering = ["-sales", "-comments", "-create_time"]
        db_table = 'commodity'
        verbose_name = "商品"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


# 商品图片表
class CommodityImg(ModelsSetMixin):
    src = models.TextField(verbose_name="图片地址")
    priority = models.IntegerField(default=0, verbose_name="优先级")
    commodity = models.ForeignKey(Commodity, on_delete=models.CASCADE, verbose_name="商品")

    class Meta:
        ordering = ["-priority", "-id"]
        db_table = 'commodityimg'
        verbose_name = "商品图"
        verbose_name_plural = verbose_name


# 购物车
class ShoppingCart(DateTimeModelsMixin):
    number = models.IntegerField(default=1, verbose_name="数量")
    commodity = models.ForeignKey(Commodity, on_delete=models.CASCADE, verbose_name="商品")
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户")

    class Meta:
        ordering = ["-update_time"]
        db_table = 'shoppingcart'
        verbose_name = "购物车"
        verbose_name_plural = verbose_name


class Order(DateTimeModelsMixin):
    PAY_METHOD_CHOICES = ((1, "支付宝"), (2, "货到付款"))
    STATUS_CHOICES = (
        (1, '待支付'),
        (2, '待发货'),
        (3, '待收货'),
        (4, '待评价'),
        (5, '已完成'),
        (6, '已取消'),
        (7, '申请退款'),
        (8, '退款成功')
    )
    order_id = models.CharField(max_length=64, primary_key=True, verbose_name="订单号")
    total_count = models.IntegerField(default=1, verbose_name="商品数")
    total_amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="商品总金额")
    pay_method = models.IntegerField(verbose_name="支付方式", default=1, choices=PAY_METHOD_CHOICES)
    status = models.IntegerField(verbose_name="订单状态", default=1, choices=STATUS_CHOICES)
    address = models.TextField(verbose_name="收货地址")

    user = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name="用户")

    class Meta:
        ordering = ["-create_time"]
        db_table = 'order'
        verbose_name = "订单表"
        verbose_name_plural = verbose_name


class OrderGoods(DateTimeModelsMixin):
    SCORE_CHOICES = (
        (0, '零星'),
        (1, '一星'),
        (2, '两星'),
        (3, '三星'),
        (4, '四星'),
        (5, '五星'),
    )
    number = models.IntegerField(default=1, verbose_name="商品数")
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="单价")
    comment = models.TextField(verbose_name="评价", null=True, blank=True)
    score = models.IntegerField(null=True, blank=True, choices=SCORE_CHOICES, verbose_name="评分")
    is_anonymous = models.BooleanField(default=False, verbose_name="匿名评价")

    # 关联订单表
    order = models.ForeignKey(Order, on_delete=models.CASCADE, verbose_name="订单")
    commodity = models.ForeignKey(Commodity, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="商品")

    class Meta:
        db_table = 'ordergoods'
        verbose_name = "订单商品"
        verbose_name_plural = verbose_name
